#pragma once
#include<iostream>
#include<jsoncpp/json/json.h>//json标准

using namespace std;

//请求格式
typedef struct request
{
    int x;
    int y;
    char op;
}request_t;

//响应格式
typedef struct response
{
    int code; //运算完毕的计算状态；code(0:success)  code(-1:div 0) ....
    int result;//计算结果
}response_t;


//request_t -> string
std::string SerializeRequest(const request_t &req)
{
    // 序列化的过程
    Json::Value root; //可以承装任何对象， json是一种kv式的序列化方案
    root["datax"] = req.x;
    root["datay"] = req.y;
    root["operator"] = req.op;

    //FastWriter, StyledWriter
    // Json::StyledWriter writer;
    Json::FastWriter writer;
    std::string json_string = writer.write(root);
    return json_string;
}

// string -> request_t
void DeserializeRequest(const std::string& json_string, request_t& out)
{
    Json::Reader reader;
    Json::Value root;

    reader.parse(json_string, root);
    //取出数据
    out.x = root["datax"].asInt();
    out.y = root["datay"].asInt();
    out.op = (char)root["operator"].asInt();
}

//response_t -> string
std::string SerializeResponse(const response_t &resp)
{
    // 序列化的过程
    Json::Value root; //可以承装任何对象， json是一种kv式的序列化方案
    root["code"] = resp.code;
    root["result"] = resp.result;

    Json::FastWriter writer;
    string json_string = writer.write(root);
    return json_string;
}
//string->response_t  
void DeserializeResponse(const std::string& json_string, response_t &out)
{
    //反序列化
    Json::Reader reader;
    Json::Value root;

    reader.parse(json_string, root);
    out.code = root["code"].asInt();
    out.result = root["result"].asInt();
}